#include "main.h"
//extern int S;
//extern pthread_mutex_t pm1,pm2;
extern sqlite3*db;
//**********************************************************主线程函数**********************************************************
void*server_TCP_fun(void*arg)
{
    int epoll_listen=*(int*)arg;
    //创建返回事件列表
    struct epoll_event epollbuf[50]={0};
    while(1)
    {
        //printf("\n阻塞等待客户端数据请求...");fflush(stdout);
        int len=epoll_wait(epoll_listen,epollbuf,50,-1);
        struct tcp_data from_buf={0};struct user_data test_userid={0};
        for(int i=0;i<len;i++)
        {
            test_userid.C=epollbuf[i].data.fd;
            int ret=read(epollbuf[i].data.fd,&from_buf,8);
            if(ret==0)
            {
                //从监听列表删除
                edit1_DB(db,2,test_userid);
                //更新账户表单(下线)

                printf("\n##客户端<%d>断开连接\n\n",test_userid.C);
            }
            if(from_buf.type==1000)
              {
                //信息同步
                pthread_t server_tcp;
                pthread_create(&server_tcp,NULL,server_tcp_fun01,&epollbuf[i].data.fd);
              }
            
        }


    }
}

//**********************************************************数据同步线程函数**********************************************************
////type==1111
void*server_tcp_fun01(void*arg)
{
    //***********************************************读取用户个人数据*********************************************************
    //查询该客户端的账号名
    int C=*(int*)arg;struct user_data temp_userid={0};
    if(inquire1_DB(db,NULL,C,&temp_userid)==-1){printf("无此用户相关数据\n");return NULL;}
    //读取该用户相关数据
    //sqlite3* user_db=NULL;
    //sqlite3_open(temp_userid.name,&user_db);
    struct contact_link*P=malloc(sizeof(struct contact_link));
    P->len=0,P->tail=P;P->next=P;
    char test[500]={0};char*errmsg=NULL;
    sprintf(test,"select * from %s ;",temp_userid.name);
    int ret;
	if((ret=sqlite3_exec(db,test,callback2,P,&errmsg))!=SQLITE_OK){printf("执行sqlite3语句7出错%d%s\n",ret,errmsg);return NULL;}
    struct contact_link*temp=P->next;
    //销毁链表头节点
    free(P);
    struct tcp_data to_buf={0};to_buf.size=0;to_buf.type=1000;
    //***************************************************开始同步*********************************************************
    while(temp!=NULL)
    {   
        //判断当前buf剩余空间是否够用(size+type+name长度+name)
        if(to_buf.size+4+2+sizeof(temp->contact_data.name)>4096)
            {
                write(C,&to_buf,8+to_buf.size);
                to_buf.size=0;
            }
        //type
        memcpy(to_buf.buf+to_buf.size,&temp->contact_data.type,4);
        to_buf.size+=4;
        //name长度
        short nmae_size=strlen(temp->contact_data.name);
        memcpy(to_buf.buf+to_buf.size,&nmae_size,2);
        to_buf.size+=2;
        //name本身
        memcpy(to_buf.buf+to_buf.size,temp->contact_data.name,nmae_size);
        to_buf.size+=nmae_size;
        //销毁已读取节点
        P=temp;
        temp=temp->next;
        free(P);P=NULL;

    }
    write(C,&to_buf,8+to_buf.size);
    to_buf.size=0;to_buf.type=1001;//结束标志，同步完成
    write(C,&to_buf,8);
    return NULL;
}
int callback2(void*arg,int argc,char**argv,char**col)
{
	//printf("查询到字段数%d\n",argc);
	struct contact_link* P=(struct contact_link*)arg;
	struct contact_link*P1=malloc(sizeof(struct contact_link));
	strcpy(P1->contact_data.name,argv[0]);
	P1->contact_data.type=atoi(argv[1]);
	P->tail->next=P1;
    P->tail=P1;
    P->len++;
	return 0;
}